/**
 * @file comm.h 程序的公用头文件
 *  包含了程序中常用的宏定义和函数声明，结构体定义等
 *  如：错误处理宏、通信协议指令标识等
 * 
 * @author pzk (1528089905@qq.com)
 * @brief 
 * @version 1.5
 * @date 2025-8-25
 * 
 * @copyright copyright (c) 2025
 */
#ifndef COMM_H
#define COMM_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pwd.h>
#include <shadow.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

//断言宏，用来简化判断流程
#define SYSERR(x,option,y,message,z)	if((x) option (y))		\
										{						\
											printf("[ERROR]%s %s %d : %s\n",__FILE__,__func__,__LINE__,message);\
											return z;			\
										}
                                        
#define SYSERR2(x,option,y,message,z)	if((x) option (y))		\
										{						\
											printf("[ERROR]%s %s %d : %s\n",__FILE__,__func__,__LINE__,message);\
											z;			\
										}

// 错误次数
#define LOOPCOUNT 3
// 管理员账号
#define ADMIN_NAME "admin"
// 管理员密码
#define ADMIN_PASS "admin"
//用户账号文件
#define USER_FILE "users.dat"
//群组文件
#define GROUP_FILE "groups.dat"
//服务器端口
#define PORT 19571
// 添加消息缓冲区大小定义
#define MAX_MSG_LEN 1024


// 通信协议指令标识
#define REGISTER_CMD  "REGISTER|"             // 注册指令
#define LOGIN_CMD     "LOGIN|"                // 登录指令
#define QUIT_CMD      "QUIT|"                 // 退出指令
#define DELETE_CMD    "DELETE|"               // 删除指令
#define SHOW_USER_CMD "SHOW_USER|"            // 显示指令
#define FIND_USER_CMD "FIND_USER|"            // 查找指令
#define LOGOUT_CMD    "LOGOUT|"               // 登出指令
#define ONLINE_CMD    "GET_ONLINE"            // 获取在线列表指令
#define USER_INFO_CMD "USER_INFO|"            // 查看信息指令
//#define FILE_TRANSFER "FILE_TRANSFER|"        // 文件传输指令

#define PRIVATE_REQUEST "PRIVATE_REQUEST|"    // 私聊请求指令
#define PRIVATE_FORWARD "PRIVATE_FORWARD|"    // 转发私聊请求
#define PRIVATE_ACCEPT "PRIVATE_ACCEPT|"      // 接受私聊
#define PRIVATE_REFUSE "PRIVATE_REFUSE|"      // 拒绝私聊
#define USER_OFFLINE   "USER_OFFLINE|"        // 用户不在线
#define PRIVATE_MSG    "PRIVATE_MSG|"         // 私聊消息内容
#define PRIVATE_EXIT   "PRIVATE_EXIT|"        // 结束私聊



// 用户结构体
typedef struct users
{
    int user_id;            // 唯一ID号
    int user_order;         // 用户排序号
    char user_pw[16];       // 用户密码
    int user_state;         // 用户状态 0不在线 1在线
    int user_friend_num;    // 好友数
    int user_group_num;     // 群聊数
    int user_age;           // 用户年龄
    char user_phone[16];    // 手机号
    char user_email[32];    // 邮箱
    char user_name[32];     // 用户名
    char sex;               // 性别
    char user_place[16];    // 居住地
} users_t;

//在线用户结构体
typedef struct online_node 
{
    struct users *u_data;          // 指向用户信息
    int client_fd;               // 客户端套接字描述符
    int is_online;
    struct sockaddr_in client_addr;
} online_node_t;

#endif // COMM_H
